UIApplication 对象是应用程序的象征
每一个应用程序都有自己的 UIApplication对象,而且是单例的.
通过 [UIApplication sharedApplication]可以获得这个单例对象
一个iOS程序启动后创建的第一个对象就是 UIApplication 对象
一个iOS程序启动后创建的第一个对象就是 UIApplication 对象
利用 UIApplication 对象,能进行一些应用级别的操作
验证单例操作:
1 | - (void)viewDidLoad { |
运行项目结果报错:
1 | 2015-04-13 19:05:19.695 forBlogTest[1897:80612] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.' |
错误信息很明确: 只能有一个 UIApplication 实例.
现在,我们改动一下程序
1 | - (void)viewDidLoad { |
控制台打印:
1 | 0x7f8453d13b80,0x7f8453d13b80 |
可以看到,地址是一样的.
利用 UIApplication 做应用级别的常见操作
1. 图标右上角的数字
如图,这个右上角的数字是可以通过代码控制的.最常见的是在推送的处理上.
1 | UIApplication *app = [UIApplication sharedApplication]; |
因为 Application 是程序级别的单例对象,所以,任何地方执行这段代码均可清除角标.
2.设置显示联网状态
通过一下代码即可让状态栏显示 “菊花”
1 | app.networkActivityIndicatorVisible = YES; |
效果如图:
3.打开 URL
- URL 一个资源的唯一路径
- URL 的组成 : 协议头://主机域名/路径
- 网络资源 URL 的组成: http://主机域名/路径 例如
http://www.baidu.com/image/1.png
- 本地资源 URL 的组成: file:///路径 因为是本地主机域名可以不写,但
/
不能省略. 例如file:///User/apple/desktop/2.png
UIApplication对象的 openURL 可以依靠协议头,打开各种需要的程序 .比如,下面的代码将会调用 Safari 打开网址
1 | [app openURL:[NSURL URLWithString:@"http://wwww.baidu.com"]]; |
如果是图片等,会自动调用相应的程序,上面的代码我们写的是 http ,所以会调用 Safari.
而下面的代码将会调用电话功能
[app openURL:[NSURL URLWithString:@"tel://10086"]];
openURL 功能是非常强大的,以下简单列举一下常用的方法
- 打电话
[app openURL:[NSURLURLWithString:@"tel://10086"]];
- 发短信
[app openURL:[NSURLURLWithString:@"sms://10086"]];
- 发邮件
[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
- 打开网页资源
[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
- 打开其他 App 根据协议头,系统进行调用
4 管理状态栏
从iOS7开始,系统提供了2种管理状态栏的方式
a.通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).
在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式
状态栏的样式
1
- (UIStatusBarStyle)preferredStatusBarStyle;
状态栏的可见性
1 | -(BOOL)prefersStatusBarHidden; |
详细代码:
1 | #pragma mark-设置状态栏的样式 |
b.通过UIApplication管理(一个应用程序的状态栏都由它统一管理)
如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置
在 info.plist文件中,添加一个:View controller-based status bar appearance
值为 NO
这样,就是不让控制器管理 statusbar
代码:
1 | //通过sharedApplication获取该程序的UIApplication对象 |
既然两种都可以对状态栏进行管理,那么什么时候该用什么呢?
如果状态栏的样式只设置一次,那就用UIApplication来进行管理;
如果状态栏是否隐藏,样式不一样那就用控制器进行管理。
UIApplication来进行管理有额外的好处,可以提供动画效果。